package com.zzyl.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.zzyl.service.WechatService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

@Slf4j
@Service
public class WeCatServiceImpl implements WechatService {
    // 获取微信用户的OpenID
    @Override
    public String getOpenId(String code) {
        // 构造请求参数
        Map<String, Object> params = new HashMap<>();
        params.put("appid", "wx1334de106d98a22d"); // 设置微信小程序的AppID
        params.put("secret", "1c533488006ffde177210ce3309f4bae"); // 设置微信小程序的AppSecret
        params.put("js_code", code); // 设置用户登录时获取的code
        params.put("grant_type", "authorization_code"); // 设置授权类型为authorization_code

        // 发起HTTP GET请求，获取微信返回的数据
        String jsonstr = HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session", params);

        // 解析返回的JSON字符串为JSONObject对象
        JSONObject jsonObject = JSONUtil.parseObj(jsonstr);

        // 如果返回结果中包含errcode字段，则抛出异常
        if (ObjectUtil.isNotEmpty(jsonObject.get("errcode"))) {
            throw new RuntimeException(jsonObject.getStr("errmsg")); // 抛出运行时异常，提示错误信息
        }

        // 返回用户的OpenID
        return jsonObject.getStr("openid");
    }

    // 获取微信用户的手机号码
    @Override
    public String getPhone(String phoneCode) {
        // 获取访问微信API所需的access_token
        String access_token = getAccessToken();

        // 构造请求URL
        String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + access_token;

        // 构造请求参数
        Map<String, Object> params = new LinkedHashMap<>();
        params.put("code", phoneCode); // 设置用户登录时获取的phoneCode

        // 将请求参数转换为JSON字符串
        String paramjson = JSONUtil.toJsonStr(params);

        // 发起HTTP POST请求，获取微信返回的数据
        String jsonstr = HttpUtil.post(url, paramjson);

        // 解析返回的JSON字符串为JSONObject对象
        JSONObject jsonObject = JSONUtil.parseObj(jsonstr);

        // 如果返回结果中包含errcode字段，则抛出异常
        Integer errcode = jsonObject.getInt("errcode");
        if (errcode != 0) {
            throw new RuntimeException(jsonObject.getStr("errmsg")); // 抛出运行时异常，提示错误信息
        }

        // 解析返回结果中的手机号码信息
        JSONObject phone_info = JSONUtil.parseObj(jsonObject.getStr("phone_info"));
        String phoneNumber = phone_info.getStr("phoneNumber");

        // 返回用户的手机号码
        return phoneNumber;
    }

    // 获取微信API访问所需的access_token
    public String getAccessToken() {
        // 构造请求参数
        Map<String, Object> params = new HashMap<>();
        params.put("appid", "wx1334de106d98a22d"); // 设置微信小程序的AppID
        params.put("secret", "1c533488006ffde177210ce3309f4bae"); // 设置微信小程序的AppSecret
        params.put("grant_type", "client_credential"); // 设置授权类型为client_credential

        // 发起HTTP GET请求，获取微信返回的数据
        String jsonstr = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token", params);

        // 解析返回的JSON字符串为JSONObject对象
        JSONObject jsonObject = JSONUtil.parseObj(jsonstr);

        // 如果返回结果中包含errcode字段，则抛出异常
        if (ObjectUtil.isNotEmpty(jsonObject.get("errcode"))) {
            throw new RuntimeException(jsonObject.getStr("errmsg")); // 抛出运行时异常，提示错误信息
        }

        // 返回获取到的access_token
        return jsonObject.getStr("access_token");
    }
}
